package cn.seqdata.forecast.model;

import cn.seqdata.forecast.model.arima.ArimaModel;
import cn.seqdata.forecast.model.lstm.PythonLstmModel;
import cn.seqdata.forecast.model.moving.SpecialMovingAverageModel;
import cn.seqdata.forecast.model.smoothing.DoubleExponentialSmoothingModel;
import cn.seqdata.forecast.model.smoothing.SimpleExponentialSmoothingModel;
import cn.seqdata.forecast.model.smoothing.TripleExponentialSmoothingModel;

import java.util.function.Supplier;

/**
 * @author jrxian
 */
public enum Models {
	/**
	 * Simple Exponential Smoothing
	 */
	SES(() -> new SimpleExponentialSmoothingModel()),
	/**
	 * Double Exponential Smoothing
	 */
	DES(() -> new DoubleExponentialSmoothingModel()),
	/**
	 * Triple Exponential Smoothing
	 */
	TES(() -> new TripleExponentialSmoothingModel()),
	/**
	 * Auto Regressive Integrated Moving Average
	 */
	ARIMA(() -> new ArimaModel()),
	/**
	 * Long Short-Term Memory
	 */
	LSTM(() -> new PythonLstmModel()),
	/**
	 * Special Moving Average
	 */
	SMA(()-> new SpecialMovingAverageModel())
    ;
	public final Supplier<AbstractModel<? extends ModelParams>> supplier;

	Models(Supplier<AbstractModel<?>> supplier) {
		this.supplier = supplier;
	}
}
